﻿#ifndef JRULEDICT_H
#define JRULEDICT_H

#include "jfileparse_global.h"
#include <QStringList>
#include <QMap>

// - class JRuleDict -

class JRuleDictPrivate;

class JFILEPARSE_EXPORT JRuleDict
{
public:
    /**
     * @brief isValid
     * @return
     */
    bool isValid() const;

    ///! parse file

    /**
     * @brief loadRuleFile, 加载规则配置文件
     * @param filePath, 配置文件名称
     * @return, true：加载成功；false：加载失败
     */
    bool loadRuleFile(const QString &filePath);

    ///! JX operation

    /**
     * @brief addJX, 增加机型
     * @param JX, 机型名称
     * @return, true：增加成功；false：增加失败
     */
    bool addJX(const QString &JX);

    /**
     * @brief removeJX, 删除机型
     * @param JX, 机型名称
     * @return, true：删除成功；false：删除失败
     */
    bool removeJX(const QString &JX);

    ///! symbol operation

    /**
     * @brief addSymbol, 增加一组别名映射
     * @param name, 别名
     * @param symbols, 一组别名标识
     * @return, true：增加成功；false：增加失败
     */
    bool addSymbol(const QString &name, const QStringList &symbols);

    /**
     * @brief addSymbol, 增加一个指定机型的别名映射
     * @param JX, 机型
     * @param name, 别名
     * @param symbols, 一组别名标识
     * @return, true：增加成功；false：增加失败
     */
    bool addSymbol(const QString &JX, const QString &name, const QStringList &symbols);

    /**
     * @brief removeSymbol, 删除一组全局别名映射
     * @param name, 别名
     * @param symbols, 一组别名标识
     * @return, true：删除成功；false：删除失败
     */
    bool removeSymbol(const QString &name, const QStringList &symbols);

    /**
     * @brief removeSymbol, 删除一组指定机型的别名映射
     * @param JX, 机型
     * @param name, 别名
     * @param symbols, 一组别名标识
     * @return, true：删除成功；false：删除失败
     */
    bool removeSymbol(const QString &JX, const QString &name, const QStringList &symbols);

    /**
     * @brief addName, 添加全局规则下的别名
     * @param name, 别名
     * @return, true：添加成功；false：添加失败
     */
    bool addName(const QString &name);

    /**
     * @brief addName, 添加指定机型下的别名
     * @param JX, 机型
     * @param name, 别名
     * @return, true：添加成功；false：添加失败
     */
    bool addName(const QString &JX, const QString &name);

    /**
     * @brief removeName, 删除一行别名映射
     * @param name, 别名
     * @return, true：删除成功；false：删除失败
     */
    bool removeName(const QString &name);

    /**
     * @brief removeName, 删除指定机型中的一行别名映射
     * @param JX, 机型
     * @param name, 别名
     * @return, true：删除成功；false：删除失败
     */
    bool removeName(const QString &JX, const QString &name);

    ///! find symbol or name

    /**
     * @brief existsSymbol, 查询别名标识是否存在
     * @param symbol, 别名标识
     * @return, true：存在；false：不存在
     */
    bool existsSymbol(const QString &symbol) const;

    /**
     * @brief existsName, 查询别名是否存在
     * @param name, 别名
     * @return, true：存在；false：不存在
     */
    bool existsName(const QString &name) const;

    /**
     * @brief allJX, 获取所有机型名称（除全局机型）
     * @return,  所有机型名称
     */
    QStringList allJX() const;

    /**
     * @brief namesOfJX, 获取指定机型的所有别名
     * @param JX, 机型（为空时返回所有全局别名）
     * @return, 别名
     */
    QStringList namesOfJX(const QString &JX) const;

    /**
     * @brief nameOfSymbol, 获取别名标识的别名
     * @param symbol, 别名标识
     * @return, 别名
     */
    QString nameOfSymbol(const QString &symbol) const;

    /**
     * @brief nameOfSymbol, 获取指定机型、信号量的别名
     * @param JX, 机型
     * @param symbol, 信号量
     * @return, 别名
     */
    QString nameOfSymbol(const QString &JX, const QString &symbol) const;

    /**
     * @brief firstSymbolOfName, 获取别名的第一个别名标识
     * @param name, 别名
     * @return, 别名标识
     */
    QString firstSymbolOfName(const QString &name) const;

    /**
     * @brief symbolsOfName, 获取别名的所有标识
     * @param name, 别名
     * @return, 所有别名标识
     */
    QStringList symbolsOfName(const QString &name) const;

    /**
     * @brief symbolsOfName, 获取指定机型、别名的所有标识
     * @param JX, 机型
     * @param name, 别名
     * @return, 所有别名标识
     */
    QStringList symbolsOfName(const QString &JX, const QString &name) const;

    /**
     * @brief ruleFilePath, 获取规则文件路径
     * @return, 规则文件路径
     */
    QString ruleFilePath() const;

    /**
     * @brief data,  获取从规则文件解析出的所有数据
     * @return, 规则数据
     */
    const QMap<QString/*JX*/, QMap<QString/*name*/, QStringList/*symbols*/> > &data() const;

    /**
     * @brief replaceJX, 将名称为oldJX的机型修改为newJX名称
     * @param oldJX, 原有名称
     * @param newJX, 新的名称
     * @return, true：修改成功；false：修改失败
     */
    bool replaceJX(const QString &oldJX, const QString &newJX);

    /**
     * @brief replaceName, 将全局规则下的别名oldName修改为newName
     * @param oldName, 原有别名
     * @param newName, 新的别名
     * @return, true：修改成功；false：修改失败
     */
    bool replaceName(const QString &oldName, const QString &newName);

    /**
     * @brief replaceName, 将指定机型下的别名oldName名称修改为newName
     * @param JX, 机型
     * @param oldName, 原有别名
     * @param newName, 新的别名
     * @return, true：修改成功；false：修改失败
     */
    bool replaceName(const QString &JX, const QString &oldName, const QString &newName);

    /**
     * @brief replaceSymbol, 将全局规则下指定别名中的变量oldSymbol名称修改为newSymbol
     * @param name, 别名
     * @param oldSymbol, 原有变量名
     * @param newSymbol, 新的变量名
     * @return, true：修改成功；false：修改失败
     */
    bool replaceSymbol(const QString &name, const QString &oldSymbol, const QString &newSymbol);

    /**
     * @brief replaceSymbol, 将指定机型、别名下的变量oldSymbol名称修改为newSymbol
     * @param JX, 机型
     * @param name, 别名
     * @param oldSymbol, 原有变量名
     * @param newSymbol, 新的变量名
     * @return, true：修改成功；false：修改失败
     */
    bool replaceSymbol(const QString &JX, const QString &name,
                       const QString &oldSymbol, const QString &newSymbol);

private:
    JRuleDict();
    ~JRuleDict();

private:
    J_DECLARE_PRIVATE(JRuleDict)
    J_DECLARE_SINGLE_INSTANCE(JRuleDict)
};

#endif // JRULEDICT_H
